package models

import (
	"errors"
	"fmt"
	"math"
	"strconv"
	"strings"
)

//定义个人信息结构体
type Boody struct {
	h   float64
	w   float64
	age float64
	sex float64
	BMI float64
	BFR float64
	pro string
	err error
}

//作业04_封装一个函数，功能为体脂计算器
func GetBMI() Boody {
	fmt.Println("     ,---,.                                                               ___                                    ,--,                             ,--,                  ___")
	fmt.Println("    ,'  .'  \\                ,---,                    .--.,              ,--.'|_                                ,--.'|                           ,--.'|                ,--.'|_")
	fmt.Println("  ,---.' .' |   ,---.      ,---.'|                  ,--.'  \\             |  | :,'                               |  | :                      ,--, |  | :                |  | :,'   ,---.    __  ,-.")
	fmt.Println("  |   |  |: |  '   ,'\\     |   | :                  |  | /\\/             :  : ' :                               :  : '                    ,'_ /| :  : '                :  : ' :  '   ,'\\ ,' ,'/ /|")
	fmt.Println("  :   :  :  / /   /   |    |   | |     .--,         :  : :    ,--.--.  .;__,'  /             ,---.     ,--.--.  |  ' |      ,---.    .--. |  | : |  ' |     ,--.--.  .;__,'  /  /   /   |'  | |' |")
	fmt.Println("  :   |    ; .   ; ,. :  ,--.__| |   /_ ./|         :  | |-, /       \\ |  |   |             /     \\   /       \\ '  | |     /     \\ ,'_ /| :  . | '  | |    /       \\ |  |   |  .   ; ,. :|  |   ,'")
	fmt.Println("  |   :     \\'   | |: : /   ,'   |, ' , ' :         |  : :/|.--.  .-. |:__,'| :            /    / '  .--.  .-. ||  | :    /    / ' |  ' | |  . . |  | :   .--.  .-. |:__,'| :  '   | |: :'  :  /")
	fmt.Println("  |   |   . |'   | .; :.   '  /  /___/ \\: |         |  |  .' \\__\\/: . .  '  : |__         .    ' /    \\__\\/: . .'  : |__ .    ' /  |  | ' |  | | '  : |__  \\__\\/: . .  '  : |__'   | .; :|  | '")
	fmt.Println("  '   :  '; ||   :    |'   ; |:  |.  \\  ' |         '  : '   ,\" .--.; |  |  | '.'|        '   ; :__   ,\" .--.; ||  | '.'|'   ; :__ :  | : ;  ; | |  | '.'| ,\" .--.; |  |  | '.'|   :    |;  : |")
	fmt.Println("  |   |  | ;  \\   \\  / |   | '/  ' \\  ;   :         |  | |  /  /  ,.  |  ;  :    ;        '   | '.'| /  /  ,.  |;  :    ;'   | '.'|'  :  `--'   \\;  :    ;/  /  ,.  |  ;  :    ;\\   \\  / |  , ;")
	fmt.Println("  |   :   /    `----'  |   :    :|  \\  \\  ;         |  : \\ ;  :   .'   \\ |  ,   /         |   :    :;  :   .'   \\  ,   / |   :    ::  ,      .-./|  ,   /;  :   .'   \\ |  ,   /  `----'   ---'")
	fmt.Println("  |   | ,'              \\   \\  /     :  \\  \\        |  |,' |  ,     .-./  ---`-'           \\   \\  / |  ,     .-./---`-'   \\   \\  /  `--`----'     ---`-' |  ,     .-./  ---`-'")
	fmt.Println("  `----'                 `----'       \\  ' ;        `--'    `--`---'                        `----'   `--`---'              `----'                         `--`---'")
	fmt.Println("体脂计算器")
	var err error
	var h string
	var w string
	var age string
	var sex string
	var ex = false
	var boody Boody
	for {
		fmt.Println("输入身高,输入exit退出计算器")
		fmt.Scan(&h)
		if strings.Contains(h, "exit") {
			ex = true
			break
		}
		boody.h, err = strconv.ParseFloat(h, 64)
		if err != nil {
			fmt.Println("请输入正确的值")
			continue
		}
		break
	}
	if ex {
		boody.err = errors.New("exit")
		return boody
	}
	for {
		fmt.Println("输入体重,输入exit退出计算器")
		fmt.Scan(&w)
		if strings.Contains(w, "exit") {
			ex = true
			break
		}
		boody.w, err = strconv.ParseFloat(w, 64)
		if err != nil {
			fmt.Println("请输入正确的值")
			continue
		}
		break
	}
	if ex {
		boody.err = errors.New("exit")
		return boody
	}
	for {
		fmt.Println("输入年龄,输入exit退出计算器")
		fmt.Scan(&age)
		if strings.Contains(age, "exit") {
			ex = true
			break
		}
		boody.age, err = strconv.ParseFloat(age, 64)
		if err != nil {
			fmt.Println("请输入正确的值")
			continue
		}
		break
	}
	if ex {
		boody.err = errors.New("exit")
		return boody
	}
	for {
		fmt.Println("输入性别,输入exit退出计算器")
		fmt.Scan(&sex)
		if strings.Contains(sex, "exit") {
			ex = true
			break
		}

		switch sex {
		case "男":
			boody.sex = 1
			break
		case "女":
			boody.sex = 0
			break
		case "1":
			boody.sex, err = strconv.ParseFloat(sex, 64)
			break
		case "0":
			boody.sex, err = strconv.ParseFloat(sex, 64)
			break
		}
		if err != nil {
			fmt.Println("请输入正确的值")
			continue
		}
		break
	}
	if ex {
		boody.err = errors.New("exit")
		return boody
	}

	boody = GetBMIOfBoody(boody)
	return boody
}

//体脂率计算
func GetBMIOfBoody(boody Boody) Boody {
	boody.BMI = boody.w * math.Pow(boody.h, 2)
	boody.BFR = 1.2*boody.BMI + 0.23*boody.age - 5.4 - 10.8*boody.sex

	switch boody.sex {
	case float64(1):
		switch true {
		case (boody.BFR < 2.0):
			boody.pro = "瘦"
			break
		case (2.0 <= boody.BFR && boody.BFR < 8.5):
			boody.pro = "偏瘦"
			break
		case (boody.BFR >= 8.5 && boody.BFR < 15.7):
			boody.pro = "理想"
			break
		case (boody.BFR >= 15.7 && boody.BFR < 26.0):
			boody.pro = "偏胖"
			break
		default:
			boody.pro = "胖"
			break
		}
		break
	case float64(0):
		switch true {
		case (boody.BFR < 11.3):
			boody.pro = "瘦"
			break
		case (11.3 <= boody.BFR && boody.BFR < 15.7):
			boody.pro = "偏瘦"
			break
		case (boody.BFR >= 15.7 && boody.BFR < 25.1):
			boody.pro = "理想"
			break
		case (boody.BFR >= 25.1 && boody.BFR < 31.3):
			boody.pro = "偏胖"
			break
		default:
			boody.pro = "胖"
			break
		}
		break
	}
	return boody
}
